﻿using Scrypt;

namespace Utils
{
    /// <summary>
    /// Scrypt 密码哈希工具类
    /// </summary>
    public static class PasswordHasher
    {
        // Scrypt 参数配置（根据服务器性能调整）
        private static readonly ScryptEncoder Encoder = new ScryptEncoder();

        /// <summary>
        /// 生成密码哈希
        /// </summary>
        public static string HashPassword(string password)
        {
            if (string.IsNullOrEmpty(password))
                throw new ArgumentNullException(nameof(password));

            return Encoder.Encode(password);
        }

        /// <summary>
        /// 验证密码
        /// </summary>
        public static bool VerifyPassword(string password, string hashedPassword)
        {
            if (string.IsNullOrEmpty(password) || string.IsNullOrEmpty(hashedPassword))
                return false;

            try
            {
                return Encoder.Compare(password, hashedPassword);
            }
            catch (Exception ex)
            {
                // 记录异常但返回验证失败
                Console.WriteLine($"密码验证异常: {ex.Message}");
                return false;
            }
        }

        /// <summary>
        /// 检查哈希格式是否符合 Scrypt 标准
        /// </summary>
        public static bool IsHashed(string input)
        {
            return !string.IsNullOrEmpty(input) && input.StartsWith("$s0$");
        }
    }
}
